import { NextRequest, NextResponse } from 'next/server';
import fs from 'fs/promises';
import path from 'path';

// 权限验证函数
function checkPermission(request: NextRequest): { hasPermission: boolean; error?: string } {
  const referer = request.headers.get('referer');
  if (!referer) {
    return { hasPermission: false, error: '缺少来源页面信息' };
  }

  try {
    const url = new URL(referer);
    const pathname = url.pathname;

    // 只允许从management页面访问
    if (pathname !== '/management') {
      return { hasPermission: false, error: '权限不足，仅允许从管理页面访问' };
    }

    return { hasPermission: true };
  } catch (error) {
    return { hasPermission: false, error: '无效的来源页面信息' };
  }
}

// 文件夹名称合规校验函数
function validateFolderName(name: string): { isValid: boolean; error?: string } {
  // 检查是否为空
  if (!name || name.trim().length === 0) {
    return { isValid: false, error: '文件夹名称不能为空' };
  }

  // 检查长度限制
  if (name.length > 255) {
    return { isValid: false, error: '文件夹名称长度不能超过255个字符' };
  }

  // 检查是否包含非法字符
  const invalidChars = /[<>:"/\\|?*\x00-\x1f]/;
  if (invalidChars.test(name)) {
    return { isValid: false, error: '文件夹名称不能包含以下字符: < > : " / \\ | ? * 以及控制字符' };
  }

  // 检查是否以点开头或结尾
  if (name.startsWith('.') || name.endsWith('.')) {
    return { isValid: false, error: '文件夹名称不能以点开头或结尾' };
  }

  // 检查是否包含连续的点
  if (name.includes('..')) {
    return { isValid: false, error: '文件夹名称不能包含连续的点' };
  }

  // 检查是否为保留名称（Windows 和 Unix 系统）
  const reservedNames = [
    'CON', 'PRN', 'AUX', 'NUL',
    'COM1', 'COM2', 'COM3', 'COM4', 'COM5', 'COM6', 'COM7', 'COM8', 'COM9',
    'LPT1', 'LPT2', 'LPT3', 'LPT4', 'LPT5', 'LPT6', 'LPT7', 'LPT8', 'LPT9'
  ];

  const upperName = name.toUpperCase();
  if (reservedNames.includes(upperName)) {
    return { isValid: false, error: '文件夹名称不能使用系统保留名称' };
  }

  // 检查是否包含空格（可选，根据需求调整）
  if (name.includes(' ')) {
    return { isValid: false, error: '文件夹名称不能包含空格' };
  }

  return { isValid: true };
}

export async function POST(request: NextRequest) {
  try {
    // 权限检查
    const permissionCheck = checkPermission(request);
    if (!permissionCheck.hasPermission) {
      return NextResponse.json(
        { success: false, error: permissionCheck.error },
        { status: 403 }
      );
    }

    const { path: dirPath, name } = await request.json();

    if (!name) {
      return NextResponse.json(
        { success: false, error: '文件夹名称是必需的' },
        { status: 400 }
      );
    }

    // 验证文件夹名称
    const validation = validateFolderName(name);
    if (!validation.isValid) {
      return NextResponse.json(
        { success: false, error: validation.error },
        { status: 400 }
      );
    }

    const baseDir = path.join(process.cwd(), 'storage');
    const targetPath = path.join(baseDir, dirPath || '', name);

    const normalizedTargetPath = path.normalize(targetPath);
    const normalizedBaseDir = path.normalize(baseDir);

    if (!normalizedTargetPath.startsWith(normalizedBaseDir)) {
      return NextResponse.json(
        { success: false, error: '无效的路径' },
        { status: 400 }
      );
    }

    try {
      // 检查目录是否已存在
      await fs.access(targetPath);
      return NextResponse.json(
        { success: false, error: '文件夹已存在' },
        { status: 409 }
      );
    } catch {
      // 目录不存在，可以创建
    }

    await fs.mkdir(targetPath, { recursive: true });

    return NextResponse.json({
      success: true,
      path: path.join(dirPath || '', name).replace(/\\/g, '/')
    });
  } catch (error) {
    console.error('Error creating directory:', error);
    return NextResponse.json(
      { success: false, error: '创建文件夹失败' },
      { status: 500 }
    );
  }
}